#include <forced.t>

class AnkleShackles: HobbleRestraint 'ankle shackles/irons/ankle cuffs' 'ankle shackles'
  "Iron shackles"
  layer = 1
  restraintList = [ defaultAnklePart ]
  isPlural = true
;

class Handcuffs: HandicapRestraint 'handcuffs/hand cuffs/hand-cuffs' 'handcuffs'
  notWornDesc = "Standard police handcuffs."
  layer = 1
  restraintList = [ defaultWristPart ]
  isPlural = true
;

class Collar: Restraint 'collar' 'collar'
  "A sturdy slave collar"
  layer = 1
  restraintList = [ defaultNeckPart ]
;

class BallGag: GagRestraint 'ball-gag/ball gag' 'ball-gag'
  "A rubber ball threaded with a sturdy leather strap."
  layer = 1
  restraintList = [ defaultMouthPart ]
;

class HogTie: HobbleRestraint, HandicapRestraint, TortureRestraint 'hogtie/hogtying rope' 'hogtie'
  wornDesc = "A rope binding <<wornBy.theNamePossAdj>> ankles to <<wornBy.itPossAdj>> wrists."
  notWornDesc = "A 5-meter rope"
  layer = 1
  painLevel = 1
  painDesc = "The rope is cutting into <<wornBy.theName>> \'s flesh.\n"
  restraintList = [defaultAnklePart, defaultWristPart]
  dobjFor(CutWith)
    {
        preCond = [touchObj]
        verify() {  }
        action() {
		say(okayUnlockMsg);
		doffMsg;
		makeWornBy(nil);
		gActor.getDropDestination(self, nil).receiveDrop(self, dropTypeDrop); 
	}
    }
  ;

class defaultRackEffectList : ShuffledEventList
	eventList = [{:"On the rack, <<gActor.theName>> {is} sweating profusely. "},
    {:"<<gActor.itPossNoun>> limbs are creaking. "},
    {:"<<gActor.theName>> tr{ies} to get some relief by pulling on <<gActor.itObj>> stretched limbs. "}];
;

class RackDevice: TortureFurniture 'rack' 'rack' "Rack"
	painLevel = 10
	damageLevel = 10
	obviousPostures = [lying]
	defaultPosture = lying
	allowedPostures = [lying]
	effectDescription = defaultRackEffectList
	
        iobjFor(RestrainTo) asIobjFor(PutOn)
        iobjFor(PutOn)
        {
            verify()
            {
                /* use the standard put-in verification */
                verifyPutInInterior();
            }

            action()
            {
                /* move the direct object onto me */
               gDobj.moveInto(self);
               if(gDobj.ofKind(ForcedPerson))
               {
                  gDobj.makePosture(defaultPosture);
        "<<gDobj.theName>> squirms as <<gDobj.itNom>> {is} made to lie on the device and {is} tied to it. ";
               }
               else
               {
                    /* issue our default acknowledgment */
                    defaultReport(&okayPutOnMsg);
               }
            }
        }
;

class defaultChairEffectList : ShuffledEventList
	eventList = ['spikes penetrate her buttocks',{:"<<gActor.theName>> squirms on the chair"}];
;

class ChairDevice: TortureFurniture 'chair' 'chair' "Spiked Chair"
	painLevel = 10
	damageLevel = 10
	obviousPostures = [sitting]
	defaultPosture = sitting
	allowedPostures = [sitting]
    effectDescription = defaultChairEffectList
        iobjFor(PutOn)
        {
            verify()
            {
                /* use the standard put-in verification */
                verifyPutInInterior();
            }

            action()
            {
                /* move the direct object onto me */
               gDobj.moveInto(self);
               if(gDobj.ofKind(ForcedPerson))
               {
                  gDobj.makePosture(defaultPosture);
                "<<gDobj.theName>> yells as {the dobj/him} is forced to sit on <<theName>>. ";
               }
               else
               {
                    /* issue our default acknowledgment */
                    defaultReport(&okayPutOnMsg);
               }
            }
        }
;

class CaneDevice: HitDevice 'cane' 'cane' "Cane"
	possibleTargetList = [ defaultBreastPart, defaultCrotchPart, defaultBackPart, defaultArmPitPart, defaultButtockPart, defaultFootPart]
	defaultTarget = defaultBackPart
	painLevel = 5
	damageLevel = 5
;